﻿<?php
/*###########################################################################
#                    written by - Joel Gaujard
###########################################################################*/

/*** Constantes pour les codes d'erreur ***/
define('UPLOAD_ERROR', "Une erreur grave s'est produite.");
define('UPLOAD_ERROR1', "Le fichier doit être précise.");
define('UPLOAD_ERROR2', "Ce type de fichier n'est pas autorisé.");
define('UPLOAD_ERROR3', "Le fichier est trop volumineux.");
$error = "L'erreur est interne au systeme !";
//define('UPLOAD_ERROR4', $error); // -4 => Le repertoire d'upload n'existe pas
//define('UPLOAD_ERROR5', $error); // -5 => Le repertoire renseigne n'est pas un repertoire
//define('UPLOAD_ERROR6', $error); // -6 => Le repertoire renseigne n'est pas accesible en ecriture

define('ALLOWED_EXTENSIONS', "gif,tif,jpg,jpeg,png,bmp");
define('MAX_FILE_SIZE', "500000");


class Uploader {

	var $input_name; // nom du champ du formulaire
	var $max_file_size; // taille max
	var $overwrite; // ecrase le fichier s'il est deja present
	var $error; // gestion des erreurs
	var $destination_relative_path; // adresse relative du repertoire de destination
	var $destination_absolute_path; // adresse absloue du repertoire de destination
	var $issue_filename; // nom du fichier final
	var $issue_relative_path; // adresse relative du repertoire final
	var $issue_absolute_path; // adresse absolu du repertoire final
	var $allowed_extension; // extension autorisee
	var $filedesc; // contient le detail de l'upload de chaque fichier
	
	function Uploader($input_name) {
		$this->input_name = $input_name;
		$this->filedesc = &$_FILES[$input_name];
		$this->max_file_size = MAX_FILE_SIZE;
		$this->allowed_extension = $this->getAllowedExtensions();
		$this->overwrite = true;
		$this->error = false;
	}

	function getAllowedExtensions() {
		$ret = explode(",", ALLOWED_EXTENSIONS);
		return ($ret);
	}

	function getExtension($format=true){
		$ret = pathinfo($this->filedesc["name"]);
		$extension = $ret["extension"];
		if ($format) {
			$extension = strtolower($extension);
		}
		return $extension;
	}

	function validateUpload() {
		// fichier non precise
		if(empty($this->filedesc["name"])) {
			$this->error = "fichier non precise";
			if (defined('UPLOAD_ERROR1')) {
				$this->error = UPLOAD_ERROR1;
			}
			return (false);
		}
		// superieur a la taille maxi autorisee
		if ($this->max_file_size < $this->filedesc["size"]) {
			$this->error = "taille trop grande";
			if (defined('UPLOAD_ERROR3')) {
				$this->error = UPLOAD_ERROR3;
			}
			$this->error.= " (taille maxi : " . $this->max_file_size . ")";
			return (false);
		}
		// verification de l'extension
		if (!in_array($this->getExtension(), $this->allowed_extension)) {
			$this->error = "extension non autorisee";
			if (defined('UPLOAD_ERROR2')) {
				$this->error = UPLOAD_ERROR2;
			}
			return (false);
		}
		
		return (true);
	}


	function validateDestination($path) {
		if (!file_exists($path)) {
			$this->error = "le repertoire precise n'existe pas";
			if (defined('UPLOAD_ERROR4')) {
				$this->error = UPLOAD_ERROR4;
			}
			return (false);
		}
		if (!is_dir($path)) {
			$this->error = "le repertoire precise n'est pas un dossier (fichier ou autre)";
			if (defined('UPLOAD_ERROR5')) {
				$this->error = UPLOAD_ERROR5;
			}
			return (false);
		}
		if (!is_writable($path)) {
			$this->error = "le repertoire precise n'est pas accessible en ecriture";
			if (defined('UPLOAD_ERROR6')) {
				$this->error = UPLOAD_ERROR6;
			}
			return (false);
		}

		return (true);
	}


	function formatFilename() { // formatage nom fichier
		$filename = basename($this->filedesc['name'], $this->getExtension(false));
    	$filename = rawurldecode($filename); // decode les codes html
	    $filename = preg_replace('/([^.a-z0-9]+)/i', '_', $filename); // remplacer les caracteres autres que lettres, chiffres et point par "_"
		return ($filename . $this->getExtension());
	}

    /*
     * @return boolean
     */
	function copyFile($destination_path = '.') {

		$this->destination_relative_path = $destination_path . '/';
		$this->destination_absolute_path = realpath($destination_path) . '/';

		if ( !$this->validateDestination($this->destination_absolute_path) ) {
			return (false);
		}
		if ( !$this->validateUpload() ) {
			return (false);
		}

        
		$issue_filename = $this->formatFilename();
		$issue_complete_filename = $this->destination_absolute_path . $issue_filename;

		// copie du fichier
		$ret = move_uploaded_file($this->filedesc['tmp_name'], $issue_complete_filename);
		if (!$ret) {
			$this->error = "Une erreur inconnue est intervenue lors de l'upload. Veuillez essayez a nouveau.";
			if (defined('UPLOAD_ERROR')) {
				$this->error = UPLOAD_ERROR;
			}
			return (false);
		}

		$this->issue_filename = $issue_filename;
		$this->issue_relative_path = $this->destination_relative_path;
		$this->issue_absolute_path = realpath($this->destination_relative_path) . '/';

		return (true);
	}

}

?>